//
//  UserAccountViewModel.swift
//  WeoboWithSteveLi
//
//  Created by SteveLi on 2017/10/4.
//  Copyright © 2017年 李军桦. All rights reserved.
//

import Foundation
/// 用户账号的视图模型 --- 没有父类
// 模型通常继承自 NSObject ->可以使用kvc设置属性,简化对象构造
//如果没有父类，所有的内容，都需要从头创建，量级更轻
//视图模型的作用：封装‘业务逻辑’，通常没有复杂的属性
class UserAccountViewModel {
    /// 单例 ---解决避免从沙盒加载 归档文件，提高效率，让 access_token 便于被访问到
    static let sharedUserAccount = UserAccountViewModel()
    
    //用户模型
    var account: UserAccount?
    //返回有效的token
    var accessToken: String? {
        //如果token 过期，返回nil
            //如果token过期,返回nil
            if !isExpired {
                return account?.access_token
            }
            return nil
    }
    /// 用户登录标记
    var userLogon: Bool {
        //1.如果 token 有值，说明登录成功
        //2.如果没有过期，说明登录有效
        return account?.access_token != nil && !isExpired 
    }
    //用户头像
    var avatarUrl : URL {
        return URL(string: account?.avatar_large ?? "")!
    }
    
    
    //归档保存路径 ---计算型属性(类似于有返回值的函数,可以让调用的时候，语意会更清晰)
     var accountPath: String {
        //1.保存路径
        let  path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last!
        return (path as NSString).appendingPathComponent("account.plist")

    }
    
    //判断账户是否过期
    private var isExpired: Bool{
        //判断用户账户过期日期与当前系统日期‘进行比较’
        //自己改写日期，测试逻辑是否正确
        //account?.expiresDate = NSDate(timeIntervalSinceNow: -3600)
        //print(account?.expiresDate ?? "")
      if account?.expiresDate?.compare(Date()) == ComparisonResult.orderedDescending{
            return false
        }
        //如果过期返回 true
        return true
    }
    /// 构造函数 ---私有化，
   private init() {
        //从沙盒解档数据，恢复当前路径 ---磁盘读取的速度最慢，不如内存读写效率
        account = NSKeyedUnarchiver.unarchiveObject(withFile: accountPath) as? UserAccount
        //判断token是否过期
        if isExpired {
            print("已经过期")
            //如果过期，清空解档的数据
            account = nil
        }
    }
}
// MARK: - 用户账户相关的网络方法
/*
 代码重构的步骤
 1.新方法
 2.粘贴代码
 3.根据上下文调整参数和返回值
 4.移动其他子方法
 */

extension UserAccountViewModel {
    /// 加载 token
    ///
    /// - parameter code:     授权码
    /// - parameter finished: 完成回调（是否成功）
    func loadAccessToken(code: String,finished: @escaping (_ isSuccessed:Bool)->()){
        //4.加载 accessToken
        NetworkTools.sharedTools.loadAccessToken(code:code) { (result, error) in
            if error != nil{
                print("出错了")
                //失败回调
                finished(false)
                return
            }
            //2.输出结果
            //创建账号对象
            self.account = UserAccount(dict: result as! [String: Any])
            self.loadUserInfo(self.account!,finished:finished)
        }
    }
    /// 加载用户信息
    ///
    /// - parameter account: 用户账户对象
    func loadUserInfo(_ account: UserAccount,finished: @escaping (_ isSuccessed:Bool)->()){
        NetworkTools.sharedTools.loadUserInfo(uid: account.uid!) { (result, error) in
            if error != nil {
                print("加载用户出错了")
                finished(false)
                return
            }
            guard let dict = result as? [String:Any] else {
                print("格式错误")
                finished(false)
                return
            }
            //dict 一定是一个有值的字典
            //将用户信息保存
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            //保存对象 - 会调用对象的 encoderWithCoder方法
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            //需要完成回调
            finished(true)
        }
    }

}


